package com.vecspace.utils.log;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.commons.lang3.ArrayUtils;

public class HLoggerCache {

	private static int keepMsgCount = 10000;//保留的最后的消息的个数
	private static Queue<String> errorQueue = new ConcurrentLinkedQueue<>();
	private static AtomicInteger errorQueueSize = new AtomicInteger(0);
	
	private static Queue<String> allLogQueue = new ConcurrentLinkedQueue<>();
	private static AtomicInteger allLogQueueSize = new AtomicInteger(0);

	/**把debug消息保留在队列中。但是仅保留最后的keepMsgCount条消息。
	 * 
	 * @param msg 
	 * @author: wanghua
	 */
	public static void putLog(Object msg){
		if(msg == null) {
			return;
		}
		DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		allLogQueue.add(dateformat.format(new Date()) + " " + msg.toString());
		int currSize = allLogQueueSize.incrementAndGet();
		//ConcurrentLinkedQueue.size() 是一个很耗时的操作,要避免使用
		//多线程操作下，会使allLogQueue.size < keepMsgCount,但因为次应用不需要严格保持keepMsgCount记录数，因此allLogQueue.size偶尔少一些数据不影响使用
		//只要保证所有线程都执行完毕之后， allLogQueueSize == allLogQueue.size 即可
		while(currSize > keepMsgCount){
			if(allLogQueue.poll() != null) { 
				currSize = allLogQueueSize.decrementAndGet();
			}
		}
	}
	
	/**返回最新的日志列表
	 *  
	 * @param msgCount 返回的日志条数，默认200
	 * @return 
	 * @author: wanghua
	 */
	public static String[] getCachedLogs(int msgCount){
		String[] array = allLogQueue.toArray(new String[0]);
		if(msgCount == 0) msgCount = 200;
		if(msgCount < array.length) {
			array = ArrayUtils.subarray(array, array.length - msgCount, array.length);
		}
		return array;
	}
	/**把error消息保留在队列中。但是仅保留最后的keepMsgCount条消息。
	 * 
	 * @param msg 
	 * @author: wanghua
	 */
	public static void putErrorLog(String msg){
		if(msg == null) {
			return;
		}
		DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		errorQueue.add(dateformat.format(new Date()) + " " + msg);
		int currSize = errorQueueSize.incrementAndGet();
		//ConcurrentLinkedQueue.size() 是一个很耗时的操作,要避免使用
		//多线程操作下，会使allLogQueue.size < keepMsgCount,但因为次应用不需要严格保持keepMsgCount记录数，因此allLogQueue.size偶尔少一些数据不影响使用
		//只要保证所有线程都执行完毕之后， allLogQueueSize == allLogQueue.size 即可
		while(currSize > keepMsgCount){
			if(errorQueue.poll() != null) {
				currSize = errorQueueSize.decrementAndGet();
			}
		}
	}
	
	/**返回最新的错误日志列表
	 *  
	 * @param msgCount 返回的日志条数，默认200
	 * @return 
	 * @author: wanghua
	 */
	public static String[] getCachedErrorLogs(int msgCount){
		String[] array = errorQueue.toArray(new String[0]);
		if(msgCount == 0) msgCount = 200;
		if(msgCount < array.length) {
			array = ArrayUtils.subarray(array, array.length - msgCount, array.length);
		}
		return array;
	}
}
